#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""资源管理器组件"""

import os
from PyQt5.QtWidgets import (
    QWidget, QVBoxLayout, QHBoxLayout, QListWidget, QListWidgetItem, 
    QLabel, QPushButton, QFileDialog, QMessageBox, QMenu, QAction
)
from PyQt5.QtCore import Qt, pyqtSignal, QSize
from PyQt5.QtGui import QPixmap, QIcon, QFont


class ResourceManager(QWidget):
    """资源管理器组件"""
    
    # 资源选择信号
    resource_selected = pyqtSignal(str)  # 传递资源文件路径
    
    def __init__(self, parent=None):
        """初始化资源管理器"""
        super().__init__(parent)
        
        # 设置窗口属性
        self.setWindowTitle("资源管理器")
        self.setMinimumWidth(200)
        
        # 当前资源目录
        self.current_resource_dir = None
        
        # 创建主布局
        main_layout = QVBoxLayout(self)
        
        # 创建工具栏
        self.create_toolbar(main_layout)
        
        # 创建资源列表
        self.resource_list = QListWidget()
        self.resource_list.setViewMode(QListWidget.IconMode)
        self.resource_list.setIconSize(QSize(64, 64))
        self.resource_list.setResizeMode(QListWidget.Adjust)
        self.resource_list.setMovement(QListWidget.Static)
        self.resource_list.setContextMenuPolicy(Qt.CustomContextMenu)
        
        # 添加到主布局
        main_layout.addWidget(self.resource_list)
        
        # 创建状态栏
        self.create_status_bar(main_layout)
        
        # 设置信号和槽
        self.setup_connections()
        
        # 创建上下文菜单
        self.create_context_menu()
        
        # 初始状态显示"无资源"的提示
        self.show_no_resource_message()
    
    def create_toolbar(self, parent_layout):
        """创建工具栏"""
        toolbar_layout = QHBoxLayout()
        
        # 添加资源按钮
        self.add_resource_btn = QPushButton("添加资源")
        self.add_resource_btn.setToolTip("添加新资源到项目")
        
        # 新建文件夹按钮
        self.new_folder_btn = QPushButton("新建文件夹")
        self.new_folder_btn.setToolTip("在当前目录创建新文件夹")
        
        # 刷新按钮
        self.refresh_btn = QPushButton("刷新")
        self.refresh_btn.setToolTip("刷新资源列表")
        
        # 添加到工具栏布局
        toolbar_layout.addWidget(self.add_resource_btn)
        toolbar_layout.addWidget(self.new_folder_btn)
        toolbar_layout.addWidget(self.refresh_btn)
        
        # 添加到主布局
        parent_layout.addLayout(toolbar_layout)
    
    def create_status_bar(self, parent_layout):
        """创建状态栏"""
        status_layout = QHBoxLayout()
        
        # 资源数量标签
        self.resource_count_label = QLabel("资源: 0")
        
        # 添加到状态栏布局
        status_layout.addWidget(self.resource_count_label)
        
        # 添加到主布局
        parent_layout.addLayout(status_layout)
    
    def setup_connections(self):
        """设置信号和槽的连接"""
        # 连接资源点击信号
        self.resource_list.itemClicked.connect(self.on_item_clicked)
        
        # 连接资源双击信号
        self.resource_list.itemDoubleClicked.connect(self.on_item_double_clicked)
        
        # 连接上下文菜单信号
        self.resource_list.customContextMenuRequested.connect(self.show_context_menu)
        
        # 连接工具栏按钮信号
        self.add_resource_btn.clicked.connect(self.add_resource)
        self.new_folder_btn.clicked.connect(self.new_folder)
        self.refresh_btn.clicked.connect(self.refresh_resources)
    
    def create_context_menu(self):
        """创建上下文菜单"""
        self.context_menu = QMenu(self)
        
        # 添加查看资源菜单项
        self.view_resource_action = QAction("查看资源", self)
        self.view_resource_action.triggered.connect(self.view_resource)
        self.context_menu.addAction(self.view_resource_action)
        
        # 添加删除资源菜单项
        self.delete_resource_action = QAction("删除资源", self)
        self.delete_resource_action.triggered.connect(self.delete_resource)
        self.context_menu.addAction(self.delete_resource_action)
        
        # 添加重命名菜单项
        self.rename_resource_action = QAction("重命名", self)
        self.rename_resource_action.triggered.connect(self.rename_resource)
        self.context_menu.addAction(self.rename_resource_action)
    
    def show_no_resource_message(self):
        """显示"无资源"的提示"""
        self.resource_list.clear()
        
        # 创建提示项
        no_resource_item = QListWidgetItem()
        no_resource_label = QLabel("无资源可用")
        no_resource_label.setAlignment(Qt.AlignCenter)
        no_resource_label.setMinimumHeight(100)
        no_resource_label.setStyleSheet("color: #808080;")
        
        # 设置提示项
        no_resource_item.setSizeHint(no_resource_label.sizeHint())
        self.resource_list.addItem(no_resource_item)
        self.resource_list.setItemWidget(no_resource_item, no_resource_label)
        
        # 更新状态栏
        self.resource_count_label.setText("资源: 0")
    
    def set_resource_directory(self, resource_dir):
        """设置资源目录"""
        # 检查目录是否存在
        if not os.path.exists(resource_dir):
            # 尝试创建目录
            try:
                os.makedirs(resource_dir)
            except Exception as e:
                QMessageBox.critical(self, "错误", f"无法创建资源目录: {str(e)}")
                return False
        
        # 设置当前资源目录
        self.current_resource_dir = resource_dir
        
        # 刷新资源列表
        self.refresh_resources()
        
        return True
    
    def refresh_resources(self):
        """刷新资源列表"""
        if not self.current_resource_dir:
            self.show_no_resource_message()
            return
        
        # 清空资源列表
        self.resource_list.clear()
        
        try:
            # 获取资源目录下的所有文件和文件夹
            items = os.listdir(self.current_resource_dir)
            
            # 分离文件夹和文件
            folders = []
            files = []
            
            for item in items:
                item_path = os.path.join(self.current_resource_dir, item)
                if os.path.isdir(item_path):
                    folders.append(item)
                else:
                    files.append(item)
            
            # 按名称排序
            folders.sort()
            files.sort()
            
            # 资源计数
            resource_count = 0
            
            # 添加文件夹
            for folder in folders:
                folder_path = os.path.join(self.current_resource_dir, folder)
                
                # 创建文件夹项
                folder_item = QListWidgetItem()
                folder_item.setIcon(QIcon.fromTheme("folder"))
                folder_item.setText(folder)
                folder_item.setToolTip(folder_path)
                folder_item.setData(Qt.UserRole, (folder_path, "folder"))
                
                # 添加到资源列表
                self.resource_list.addItem(folder_item)
                
                resource_count += 1
            
            # 添加文件
            for file in files:
                file_path = os.path.join(self.current_resource_dir, file)
                
                # 获取文件扩展名
                _, ext = os.path.splitext(file)
                ext = ext.lower()
                
                # 支持的图像格式
                image_formats = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg']
                
                # 创建文件项
                file_item = QListWidgetItem()
                
                # 如果是图像文件，显示缩略图
                if ext in image_formats:
                    pixmap = QPixmap(file_path)
                    if not pixmap.isNull():
                        scaled_pixmap = pixmap.scaled(64, 64, Qt.KeepAspectRatio, Qt.SmoothTransformation)
                        file_item.setIcon(QIcon(scaled_pixmap))
                    else:
                        # 图像无法加载，使用默认图标
                        file_item.setIcon(QIcon.fromTheme("image-x-generic"))
                else:
                    # 其他文件类型，使用默认图标
                    file_item.setIcon(QIcon.fromTheme("text-x-generic"))
                
                file_item.setText(file)
                file_item.setToolTip(file_path)
                file_item.setData(Qt.UserRole, (file_path, "file"))
                
                # 添加到资源列表
                self.resource_list.addItem(file_item)
                
                resource_count += 1
            
            # 更新状态栏
            self.resource_count_label.setText(f"资源: {resource_count}")
        except Exception as e:
            QMessageBox.critical(self, "错误", f"无法加载资源: {str(e)}")
            self.show_no_resource_message()
    
    def on_item_clicked(self, item):
        """处理资源点击事件"""
        # 获取资源信息
        resource_info = item.data(Qt.UserRole)
        
        if not resource_info:
            return
        
        resource_path, resource_type = resource_info
        
        # 发送资源选择信号
        self.resource_selected.emit(resource_path)
    
    def on_item_double_clicked(self, item):
        """处理资源双击事件"""
        # 获取资源信息
        resource_info = item.data(Qt.UserRole)
        
        if not resource_info:
            return
        
        resource_path, resource_type = resource_info
        
        # 如果是文件夹，进入该文件夹
        if resource_type == "folder":
            self.current_resource_dir = resource_path
            self.refresh_resources()
        # 如果是文件，查看资源
        elif resource_type == "file":
            self.view_resource(item)
    
    def show_context_menu(self, position):
        """显示上下文菜单"""
        # 获取当前选中的资源
        selected_items = self.resource_list.selectedItems()
        
        if not selected_items or not self.current_resource_dir:
            return
        
        # 显示上下文菜单
        self.context_menu.exec_(self.resource_list.mapToGlobal(position))
    
    def add_resource(self):
        """添加资源"""
        if not self.current_resource_dir:
            QMessageBox.warning(self, "警告", "请先设置资源目录")
            return
        
        # 打开文件对话框
        file_paths, _ = QFileDialog.getOpenFileNames(
            self, "选择资源文件", "", 
            "所有文件 (*);;图像文件 (*.jpg *.jpeg *.png *.gif *.bmp *.svg);;图标文件 (*.ico *.icns);;音频文件 (*.mp3 *.wav *.ogg);;视频文件 (*.mp4 *.avi *.mov)"
        )
        
        if file_paths:
            import shutil
            
            # 复制文件到资源目录
            for file_path in file_paths:
                try:
                    # 获取文件名
                    file_name = os.path.basename(file_path)
                    
                    # 目标路径
                    dest_path = os.path.join(self.current_resource_dir, file_name)
                    
                    # 检查文件是否已存在
                    if os.path.exists(dest_path):
                        # 询问是否覆盖
                        reply = QMessageBox.question(
                            self, "文件已存在", 
                            f"文件 '{file_name}' 已存在，是否覆盖？",
                            QMessageBox.Yes | QMessageBox.No, QMessageBox.No
                        )
                        
                        if reply != QMessageBox.Yes:
                            continue
                    
                    # 复制文件
                    shutil.copy2(file_path, dest_path)
                except Exception as e:
                    QMessageBox.critical(self, "错误", f"无法添加资源 '{file_path}': {str(e)}")
            
            # 刷新资源列表
            self.refresh_resources()
    
    def new_folder(self):
        """新建文件夹"""
        if not self.current_resource_dir:
            QMessageBox.warning(self, "警告", "请先设置资源目录")
            return
        
        # 显示文件夹名输入对话框
        from PyQt5.QtWidgets import QInputDialog
        folder_name, ok = QInputDialog.getText(self, "新建文件夹", "请输入文件夹名:")
        
        if ok and folder_name:
            folder_path = os.path.join(self.current_resource_dir, folder_name)
            
            # 检查文件夹是否已存在
            if os.path.exists(folder_path):
                QMessageBox.warning(self, "警告", "文件夹已存在")
                return
            
            try:
                # 创建文件夹
                os.makedirs(folder_path)
                
                # 刷新资源列表
                self.refresh_resources()
            except Exception as e:
                QMessageBox.critical(self, "错误", f"无法创建文件夹: {str(e)}")
    
    def view_resource(self, item=None):
        """查看资源"""
        # 如果没有指定项目，使用当前选中的项目
        if not item:
            selected_items = self.resource_list.selectedItems()
            if not selected_items:
                return
            item = selected_items[0]
        
        # 获取资源信息
        resource_info = item.data(Qt.UserRole)
        
        if not resource_info:
            return
        
        resource_path, resource_type = resource_info
        
        # 如果是文件，查看资源
        if resource_type == "file":
            # 获取文件扩展名
            _, ext = os.path.splitext(resource_path)
            ext = ext.lower()
            
            # 支持的图像格式
            image_formats = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.svg']
            
            # 如果是图像文件，显示图像
            if ext in image_formats:
                from PyQt5.QtWidgets import QDialog, QVBoxLayout, QLabel, QPushButton, QHBoxLayout
                from PyQt5.QtCore import Qt
                
                # 创建查看对话框
                view_dialog = QDialog(self)
                view_dialog.setWindowTitle(os.path.basename(resource_path))
                view_dialog.resize(600, 400)
                
                # 创建布局
                dialog_layout = QVBoxLayout(view_dialog)
                
                # 创建图像标签
                image_label = QLabel()
                image_label.setAlignment(Qt.AlignCenter)
                
                # 加载图像
                pixmap = QPixmap(resource_path)
                if not pixmap.isNull():
                    # 缩放图像以适应对话框
                    scaled_pixmap = pixmap.scaled(
                        580, 350, Qt.KeepAspectRatio, Qt.SmoothTransformation
                    )
                    image_label.setPixmap(scaled_pixmap)
                
                # 添加到布局
                dialog_layout.addWidget(image_label)
                
                # 创建底部按钮布局
                button_layout = QHBoxLayout()
                
                # 创建关闭按钮
                close_button = QPushButton("关闭")
                close_button.clicked.connect(view_dialog.close)
                
                # 添加到按钮布局
                button_layout.addWidget(close_button)
                
                # 添加到对话框布局
                dialog_layout.addLayout(button_layout)
                
                # 显示对话框
                view_dialog.exec_()
            else:
                # 其他文件类型，显示文件信息
                QMessageBox.information(
                    self, "文件信息",
                    f"文件: {os.path.basename(resource_path)}\n" +
                    f"路径: {resource_path}\n" +
                    f"大小: {os.path.getsize(resource_path)} 字节"
                )
    
    def delete_resource(self):
        """删除资源"""
        # 获取当前选中的资源
        selected_items = self.resource_list.selectedItems()
        
        if not selected_items or not self.current_resource_dir:
            return
        
        # 确认删除
        reply = QMessageBox.question(
            self, "确认删除",
            f"确定要删除选中的 {len(selected_items)} 个资源吗？",
            QMessageBox.Yes | QMessageBox.No, QMessageBox.No
        )
        
        if reply == QMessageBox.Yes:
            for item in selected_items:
                resource_info = item.data(Qt.UserRole)
                
                if not resource_info:
                    continue
                
                resource_path, resource_type = resource_info
                
                try:
                    # 删除文件或文件夹
                    if resource_type == "file":
                        os.remove(resource_path)
                    elif resource_type == "folder":
                        import shutil
                        shutil.rmtree(resource_path)
                except Exception as e:
                    QMessageBox.critical(
                        self, "错误",
                        f"无法删除 '{os.path.basename(resource_path)}': {str(e)}"
                    )
            
            # 刷新资源列表
            self.refresh_resources()
    
    def rename_resource(self):
        """重命名资源"""
        # 获取当前选中的资源
        selected_items = self.resource_list.selectedItems()
        
        if not selected_items or len(selected_items) > 1 or not self.current_resource_dir:
            return
        
        item = selected_items[0]
        resource_info = item.data(Qt.UserRole)
        
        if not resource_info:
            return
        
        resource_path, resource_type = resource_info
        current_name = os.path.basename(resource_path)
        
        # 显示重命名对话框
        from PyQt5.QtWidgets import QInputDialog
        new_name, ok = QInputDialog.getText(
            self, "重命名", "请输入新名称:", text=current_name
        )
        
        if ok and new_name and new_name != current_name:
            # 获取父目录
            parent_dir = os.path.dirname(resource_path)
            new_path = os.path.join(parent_dir, new_name)
            
            # 检查新名称是否已存在
            if os.path.exists(new_path):
                QMessageBox.warning(self, "警告", "名称已存在")
                return
            
            try:
                # 重命名文件或文件夹
                os.rename(resource_path, new_path)
                
                # 刷新资源列表
                self.refresh_resources()
            except Exception as e:
                QMessageBox.critical(self, "错误", f"无法重命名: {str(e)}")
    
    def get_current_resource_dir(self):
        """获取当前资源目录"""
        return self.current_resource_dir